/* Or-Done模式是在多个任务场景，只要有一个任务执行完，就会知道这个完成信号 */
package channelWorkloads

import "reflect"

func or(channels ...<-chan interface{}) <-chan interface{} {
	switch len(channels) {
	case 0:
		return nil

	case 1:
		return channels[0]
	}

	orDone := make(chan interface{})
	go func() {
		var cases []reflect.SelectCase
		for _, c := range channels {
			cases = append(cases, reflect.SelectCase{
				Dir:  reflect.SelectRecv,
				Chan: reflect.ValueOf(c),
			})
		}
		reflect.Select(cases)
	}()
	return orDone
}
